<?xml version = '1.0' encoding = 'UTF-8'?>
<HBRRepo><variables><variable name="OQP_Scenario" type="member" usage="const" id="2" product="Planning"><property name="application">SalesPln</property><property name="dimensionInputMode">type</property><property name="dimensionType">Scenario</property><property name="prompt_text">LABEL_QTP_SLS_PLAN_PRMPT_SCENARIO</property><property name="scope">ruleset</property><property name="seeded">true</property><value/></variable><variable name="OQP_Version" type="member" usage="const" id="1" product="Planning"><property name="application">SalesPln</property><property name="dimensionInputMode">type</property><property name="dimensionType">Version</property><property name="prompt_text">LABEL_QTP_SLS_PLAN_PRMPT_VERSION</property><property name="scope">ruleset</property><property name="seeded">true</property><value/></variable><variable name="OQP_Year" type="member" usage="const" id="3" product="Planning"><property name="application">SalesPln</property><property name="dimension">Years</property><property name="dimensionInputMode">name</property><property name="prompt_text">LABEL_QTP_SLS_PLAN_PRMPT_YEAR</property><property name="scope">ruleset</property><property name="seeded">true</property><value/></variable></variables><rulesets/><rules><rule id="1" name="OQP_Set Target by Product" product="Planning"><property name="application">SalesPln</property><property name="plantype">OEP_QTP</property><property name="seeded">true</property><variable_references><variable_reference name="OQP_Scenario" id="2"><property name="application">SalesPln</property><property name="hidden">false</property><property name="rule_name">OQP_Set Target by Product</property><property name="seq">1</property><property name="type">3</property><property name="useAsOverrideValue">false</property><property name="validation_value">OEP_Plan</property></variable_reference><variable_reference name="OQP_Version" id="1"><property name="application">SalesPln</property><property name="hidden">false</property><property name="rule_name">OQP_Set Target by Product</property><property name="seq">2</property><property name="type">3</property><property name="useAsOverrideValue">false</property><property name="validation_value">OEP_Working</property></variable_reference><variable_reference name="OQP_Year" id="3"><property name="application">SalesPln</property><property name="hidden">false</property><property name="rule_name">OQP_Set Target by Product</property><property name="seq">3</property><property name="type">3</property><property name="useAsOverrideValue">false</property><property name="validation_value">FY17</property></variable_reference></variable_references><script type="groovy">		/*RTPS:{OQP_Version} {OQP_Scenario} {OQP_Year}*/
		/*PURPOSE: This rule calculates Target Quota Based on percentage input by product,Aggregates across all dimensions then recalculates percentages */
		String Scenario=rtps.OQP_Scenario.member.name;
		String Version=rtps.OQP_Version.member.name;		
		String Year=rtps.OQP_Year.member.name;
		List&lt;String> CustomRelDimensions=[];
		List&lt;String> CustomDimMembers=[];
		List&lt;String> CustomDimensions=[];
		boolean isDataModified = false;
        boolean isUnitsModel =false;
        String driverDimMember;
		String strColDim;
		String strColDimName;
		String strRowDim

		List&lt;String> ColumnDimensions =[];
		List&lt;String> RowDimensions =[];
		List&lt;String> NewColumnDims =[];
		String strCrossDim = "";
		def grid=operation.grid;
		try
		{
         /*Evalute if Quota planning model is enabled for units or  Amount */
        	Application app=operation.getApplication();
			Cube qtp=operation.getCube(); 
			Dimension dim=app.getDimension(DimensionType.ACCOUNT,qtp);
        	if (dim.hasMember("OQP_Units",qtp)==true)
          	{
				isUnitsModel=true;
				driverDimMember="OQP_Last Year Units";
            }
			else
			{
				 isUnitsModel=false;
				 driverDimMember="OQP_Last Year Revenue";                    
			}        
		/*Identify POV Dimensoins and their members*/
		List&lt;DataGrid.HeaderCell> hcells=grid.getPov()
            hcells.each{
				def dimName = it.getDimName();
				String mbrName=it.getMbrName();
				if (!mbrName.equals(Scenario) &amp;&amp; !mbrName.equals(Version) &amp;&amp; !it.getDimensionType().equals(DimensionType.SIMPLE_CURRENCY) &amp;&amp; !mbrName.equals(Year))
				{
					CustomRelDimensions.add('''@Relative("'''+mbrName+'''",0)''');
					CustomDimMembers.add('''"'''+mbrName+'''"''')
					strCrossDim= strCrossDim + "\""+ mbrName+"\"->"
					CustomDimensions.add('''"'''+dimName+'''"''');
				}
			
            }		
            /*START : Generate Calculation Script  - Main Fix*/  
		StringBuilder cscript = new StringBuilder();
		cscript.append('''SET AGGMISSG ON;\n''');
		cscript.append('''SET UPDATECALC OFF;\n''');
		cscript.append('''FIX("'''+ Year +'''",''')
		cscript.append ('''"'''+Version+'''"''')
		cscript.append (''',"'''+Scenario+'''"''')
		if (app.getCurrencyMode()!=CurrencyMode.SINGLE_CURRENCY)
        {
				String sCurrency =  operation.grid.pov.find { it.dimName == 'Currency' }.essbaseMbrName 
                //cscript.append (''',"'''+app.getDefaultCurrency()+'''"''')
                cscript.append (''',"'''+ sCurrency +'''"''')
        }
		cscript.append (''')\n''')
        /*Identify Row Dimensions*/
		List&lt;DataGrid.Row> rows = grid.getRows()
		for (DataGrid.Row row : rows) 
		{
			List&lt;DataGrid.HeaderCell> subRows = row.getHeaders();
			for(DataGrid.HeaderCell cell : subRows) 
			  {
				String memName = cell.getDimName();  
			  if (!RowDimensions.contains(memName))
			   {
					RowDimensions.add(memName)      	 
			   }     	 
			 }        
		}
         /*Identify Column Dimensions*/
		List&lt;List&lt;DataGrid.HeaderCell>> cols = grid.getColumns();
		for (List&lt;DataGrid.HeaderCell> cells : cols) 
		{
		 
			for (DataGrid.HeaderCell cell : cells)  
			  {
			   String memName = cell.getMbrName();
			   String dimName = cell.getDimName();
			   if (!ColumnDimensions.contains(dimName))
				  {
					if (memName.equals("YearTotal") || memName.equals(driverDimMember)  )
					{
						ColumnDimensions.add(dimName)
					}
					else
					{
					 if(!NewColumnDims.contains(dimName))	
							{
								NewColumnDims.add(dimName)
								strColDimName=dimName;
							}
					}
			   
				 }   	
			 }
					   
		 }
		strCrossDim= strCrossDim +'''"OQP_Growth%"->"BegBalance"'''

		cscript.append('''	FIX(@Relative("Yeartotal",0)''')
		 if (CustomRelDimensions.size()>0)
			{
				cscript.append( ''','''+CustomRelDimensions.join(''','''))
			}
		cscript.append(''')\n''')

		if (RowDimensions.size()==1)
		{
		  def ls=operation.grid.dataCellIterator{DataCell cell -> cell.edited}.collect([] as Set,{ DataCell cell ->
			cell.getMemberName(RowDimensions[0])    
		})
		if (ls.size()>0)
		{
		isDataModified=true;
		}
		strRowDim='''OEP_All '''+RowDimensions[0];
		for(String mbrName:ls)	
		{
		cscript.append('''		FIX("'''+mbrName+'''")\n''')
		if (NewColumnDims.size() == 1)
		{
		 def Column=operation.grid.dataCellIterator{DataCell cell -> cell.edited}.collect([] as Set,{ DataCell cell ->
			cell.getMemberName(NewColumnDims[0])
		})
		strColDim='''OEP_All ''' + NewColumnDims[0]
		/*Apply new percentages for each product group*/
		for(String colMbrName:Column)
		{
		cscript.append('''			FIX(@Relative("'''+colMbrName+'''",0))\n''')
		cscript.append('''				"OQP_Target Quota" \n''')
		cscript.append('''					( \n''')
		cscript.append('''					"OQP_Target Quota" = (1+('''+strCrossDim+'''->"'''+colMbrName+'''")) * "'''+driverDimMember+'''";\n''')
		cscript.append('''					"OQP_Allocated Target Quota" = (1+('''+strCrossDim+'''->"'''+colMbrName+'''")) * "'''+driverDimMember+'''";\n''')		
		cscript.append('''					) \n''')
		cscript.append('''			ENDFIX; \n''')
		}
		}
		else
		{

		cscript.append('''			"OQP_Target Quota" \n''')
		cscript.append('''			( \n''')
		cscript.append('''			"OQP_Target Quota" = (1+('''+strCrossDim+''')) * "'''+driverDimMember+'''";\n''')
		cscript.append('''			"OQP_Allocated Target Quota" = (1+('''+strCrossDim+''')) * "'''+driverDimMember+'''";\n''')		
		cscript.append('''			) \n''')

		}
		cscript.append('''		ENDFIX; \n''')
		}
		}
		cscript.append('''	ENDFIX; \n''')
        /*Aggregate  Cube */
		cscript.append('''	FIX(''')
		cscript.append ('''"OQP_Allocated Target Quota","'''+driverDimMember+'''","OQP_Number of Reps","OQP_Number of Accounts","OQP_Target Quota")\n''')
		cscript.append ('''		FIX(@CHILDREN("'''+strRowDim+'''"))\n''');
		cscript.append ('''			AGG(''');
		cscript.append (CustomDimensions.join(''','''))
		
		if (strColDim!=null)
		{
		cscript.append(''',"'''+strColDimName+'''"''')
		}
		cscript.append (''');\n''')
		cscript.append('''		ENDFIX; \n''')		
		cscript.append ('''		"'''+strRowDim+'''";\n''')
		cscript.append('''	ENDFIX; \n''')

		cscript.append('''	FIX(''')
		cscript.append ('''@ICHILDREN("'''+strRowDim+'''")''');
		if(CustomDimMembers.size()>0)
		{
		cscript.append (''','''+CustomDimMembers.join(''','''))
		}
		if (strColDim!=null)
		{
		cscript.append(''','''+'''@ICHILDREN("'''+strColDim+'''")''')
		}
		cscript.append(''')\n''')
        /*Recalulate Growth Percentage*/
		cscript.append('''		"OQP_Growth%"''')
		cscript.append('''		( \n''')
		cscript.append('''			"OQP_Growth%"  = (("OQP_Target Quota"->"YearTotal"-"'''+driverDimMember+'''"->"YearTotal")/ "'''+driverDimMember+'''"->"YearTotal");\n''')
		cscript.append('''		) \n''')
		cscript.append('''	ENDFIX; \n''')

		cscript.append('''ENDFIX; \n''')
		if (isDataModified==true) 
		{
		println (cscript.toString())
		return cscript.toString()
		}
		else
		{
		println ("No cells modified") 
		}
		}catch(all) {
			throw new HspRuntimeException('Error occured while executing business rule');
		}	
		
		</script></rule></rules><components/><deployobjects><deployobject product="2" application="salespln" plantype="oep_qtp" obj_id="1" obj_type="1" name="OQP_SET TARGET BY PRODUCT"/></deployobjects></HBRRepo>